package com.lingxu.traffic.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.lingxu.base.system.manage.entity.SysDepart;
import com.lingxu.base.system.manage.entity.SysUser;
import com.lingxu.base.system.manage.service.ISysDepartService;
import com.lingxu.base.system.manage.service.ISysUserService;
import com.lingxu.traffic.mapper.UserOrgMapper;
import com.lingxu.traffic.service.UserOrgService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @ClassName IUserOrgSeriveImpl
 * @Description 描述
 * @Author junyi.wang
 * @Date 2025/7/26 18:28
 */
@Slf4j
@Service
public class IUserOrgSeriveImpl implements UserOrgService {
    @Value("${apiService.orgCode}")
    private String orgCode;
    @Value("${apiService.user.url}")
    private String userUrl;
    @Value("${apiService.user.token}")
    private String userToken;

    @Value("${apiService.org.url}")
    private String orgUrl;
    @Value("${apiService.org.token}")
    private String orgToken;

    @Value("${apiService.userOrg.url}")
    private String userOrgUrl;
    @Value("${apiService.userOrg.token}")
    private String userOrgToken;

    @Value("${apiService.userOrg.roleId}")
    private String userOrgRoleId;

    @Resource
    private ISysUserService sysUserService;

    @Resource
    private ISysDepartService sysDepartService;

    @Resource
    private UserOrgMapper userOrgMapper;

    @Override
//    @Async("asyncTaskExecutor")
    public void synchronousUser() {
        log.info("同步用户开始");
        userOrgMapper.deleteUser();
        // 1. 分页信息（保留，默认第一页500条）
        Integer pageNo = 1;
        Integer pageSize = 5000;
        Map<String,Boolean> isInsert = new HashMap<>();
        while(true) {
            JSONObject jsonObject = buildJsonData(pageNo++,pageSize,orgCode,userToken);
            log.info("获取用户请求报文:{}",jsonObject.toJSONString());
            String resBody = ApiUtils.getDate(userUrl, jsonObject.toJSONString());
            if(null==resBody) {
                break;
            }
            JSONArray array = ApiUtils.parseResult(resBody);
            if(CollectionUtils.isEmpty(array)) {
                break;
            }
            List<SysUser> sysUsers = buildSysUesr(array);
            if(sysUsers!=null && sysUsers.size()>0){
                sysUsers.forEach(v->{
                    Boolean b = isInsert.get(v.getId());
                    if(b==null){
                        isInsert.put(v.getId(),true);
                    }else{
                        v.setId(UUID.randomUUID().toString().split("-")+"_"+v.getId());

                    }
                });
            }

            sysUserService.saveBatch(sysUsers);

        }
        //处理权限
        userOrgMapper.deleteUserRole();
        userOrgMapper.createUserRole(userOrgRoleId);
        //同步账号到T_SYS_USER
        userOrgMapper.deleteTsysUser();
        userOrgMapper.createTsysUser();
        //同步用户信息到SYSTEM_USERS
        userOrgMapper.deleteSysTemUsers();
        userOrgMapper.createSysTemUsers();
        log.info("同步用户结束");
    }

    private List<SysUser> buildSysUesr(JSONArray array) {
        List<SysUser> sysUsers = new ArrayList<>();
        if(CollectionUtils.isEmpty(array)) {
            return sysUsers;
        }
        array.forEach(i->{
            JSONObject u = JSONObject.parseObject(i.toString());
            String userType = u.getString("USER_TYPE");
            if("1".equals(userType)) {
                SysUser user = new SysUser();
//                log.info("{}-{}-{}",u.getString("SU_REALNAME"),u.getString("SU_LOGINNAME"),u.getString("SU_PWD"));
//            SU_REALNAME	VARCHAR2	100	真实姓名
                user.setId("mh:" +u.getString("SU_ID"));
                user.setName(u.getString("SU_REALNAME"));
                user.setUsername(u.getString("SU_LOGINNAME"));
                user.setPassword(u.getString("SU_PWD"));
                user.setSex(u.getString("SU_SEX"));
                user.setStatus("1");
                user.setIsdel("0");
                user.setRegion("320001");
                //  user.setPersonsort(Integer.valueOf(u.getString("SU_ORDER")));  用户排序
//            SU_LOGINNAME	VARCHAR2	100	登录名

//            SU_PWD	VARCHAR2	100	密码
//                String passwordEncode = MD5Utils.Md5Encrypt(u.getString("SU_PWD"));

//            SU_NATION	VARCHAR2	50	民族
//            SU_POST	VARCHAR2	500	职务
//            SU_PHONE	VARCHAR2	45	手机号码
//            SU_EMAIL	VARCHAR2	100	邮箱
//            SU_TOKEN	VARCHAR2	2000	用户令牌
//            REMARK	VARCHAR2	2000	备用
//            U_ID	VARCHAR2	500	外系统ID
//            P_ID	VARCHAR2	500	外系统密码
//            SU_STAFF	VARCHAR2	50	工号
//            SU_MTOKEN	VARCHAR2	2000	APP令牌
//            USER_TYPE	VARCHAR2	10	人员类型 1：行业内人员 2：行业第三方用户 3：从业个人 4：从业企业 5：社会公众
//            IS_ADMIN	VARCHAR2	1	是否为管理员 0：否 1：是
//            ID_CARD_NO	VARCHAR2	20	身份证号
//            PROFILE_PHOTO	VARCHAR2	512	用户头像路径
//            SIGNATURE	VARCHAR2	255	个性签名
//            CODE	VARCHAR2	50	用户编码
//            WECHAT_OPENID	VARCHAR2	50	微信唯一用户ID
//            ZFB_OPENID	VARCHAR2	50	支付宝唯一用户ID
//            QQ_OPENID	VARCHAR2	50	QQ唯一用户ID
//            SYNC_ID	VARCHAR2	100	数据超市人员统一id
//            CORP_SYNC_ID	VARCHAR2	100	数据超市企业统一id（对应企业列表接口中的syncId）
//            EXMAIL_ID	VARCHAR2	100	企业邮箱号
//            SU_FIRST_NAME	VARCHAR2	20	用户名字首字大写拼音
//            BACKGROUND_PHOTO	VARCHAR2	512	个人工作台背景图
//            CLEARTEXT_PWD	VARCHAR2	50	明文
//            UNIQUE_ID	VARCHAR2	50	唯一键
//            SU_BIRTHDAY	DATE		生日
//            SU_POSITIVE_TIME	DATE		转正时间
//            SU_CREATE_TIME	DATE		创建时间
//            SU_UPDATE_TIME	DATE		更新时间
//            LOCK_TIME	DATE		锁定时间
//            SU_ID	NUMBER		主键
//            SU_SEX	NUMBER		性别(1男2女)
//            SU_CREATE_BY	NUMBER		创建者
//            SU_UPDATE_BY	NUMBER		更新者
//            SU_IS_DISABLED	NUMBER		是否禁用(0启用1禁用) <==> 用户状态 0冻结 1正常
//            SU_LOCKED	NUMBER		是否冻结 1是 其他否
//            MOOD_TYPE	NUMBER		心情图标类型
//            IS_DELETE	NUMBER		是否删除 0：否 1：是
//            SU_ORDER	NUMBER		排序

                sysUsers.add(user);
            }
        });
        return sysUsers;
    }

    @Override
    @Async("asyncTaskExecutor")
    public void synchronousOrg() {
        log.info("同步组织架构开始");
        userOrgMapper.deleteOrg();
        Integer pageNo = 1;
        Integer pageSize = 500;
        while(true) {
            JSONObject jsonObject = buildJsonData(pageNo++,pageSize,orgCode,orgToken);
            log.info("获取组织架构请求报文:{}",jsonObject.toJSONString());
            String resBody = ApiUtils.getDate(orgUrl, jsonObject.toJSONString());
            if(null==resBody) {
                break;
            }
            JSONArray array = ApiUtils.parseResult(resBody);
            if(CollectionUtils.isEmpty(array)) {
                break;
            }
            List<SysDepart> sysDeparts = buildSysDepart(array);
            sysDepartService.saveBatch(sysDeparts);
        }
        //同步账号到SYSTEM_DEPT
        userOrgMapper.deleteSystemDept();
        userOrgMapper.createSystemDept();
        log.info("同步组织架构结束");
    }

    private List<SysDepart> buildSysDepart(JSONArray array) {
        List<SysDepart> sysDeparts = new ArrayList<>();
        if(CollectionUtils.isEmpty(array)) {
            return sysDeparts;
        }
        array.forEach(i-> {
            JSONObject d = JSONObject.parseObject(i.toString());
            String disabled  = d.getString("SD_IS_DISABLED");
            if("0".equals(disabled)) {
                SysDepart depart = new SysDepart();
//            SD_NAME	VARCHAR2	200	名称
                depart.setName(d.getString("SD_NAME"));
//            SD_CODE	VARCHAR2	50	代码
                depart.setCode(d.getString("SD_CODE"));
//            SD_SHORTNAME	VARCHAR2	200	简称
                depart.setEname(d.getString("SD_SHORTNAME"));
//            SD_POST	VARCHAR2	20	邮编
//            SD_TEL	VARCHAR2	20	联系电话
                depart.setTelephone(d.getString("SD_TEL"));
//            SD_FAX	VARCHAR2	50	传真
//            SD_ADDRESS	VARCHAR2	100	地址
                depart.setAddress(d.getString("SD_ADDRESS"));
//            SD_DESC	VARCHAR2	1000	简介
//            SD_LEVEL	VARCHAR2	20	机构级别
//            SD_TYPE	VARCHAR2	20	机构类型 01：内部机构；02：自定义机构；03：三方公司
//            THIRD_SD_ID	VARCHAR2	500	归属组织机构
//            OU	VARCHAR2	1024	机构OU信息 用ID分割
//            DEPT_TYPE	VARCHAR2	20	组织机构类型 o：单位；ou：部门
//            REMARK	VARCHAR2	50	备注
//            SD_CREATE_TIME	DATE		创建日期
//            SD_UPDATE_TIME	DATE		更新日期
//            SD_ID	NUMBER		部门主键
                depart.setId("mh:" + d.getString("SD_ID"));
//            SD_PID	NUMBER		上级业务机构ID
                if ("mh:1".equals(depart.getId())) {
                    depart.setPid("0");
                } else {
                    depart.setPid("mh:" + d.getString("SD_PID"));
                }
//            SD_ORDER	NUMBER		排序
                depart.setSortnum(d.getString("SD_ORDER"));
//            SD_CREATE_BY	NUMBER		创建人
//            SD_UPDATE_BY	NUMBER		更新人
//            SD_IS_DISABLED	NUMBER		是否禁用(0启用1禁用)<==>是否删除（0否1是）
                depart.setIsdel(d.getString("SD_IS_DISABLED"));
//            EXMAIL_ID	NUMBER		邮箱ID-部门对应的邮箱ID
//            HEAD_USER	NUMBER		机构负责人
                sysDeparts.add(depart);
            }
        });
        return sysDeparts;
    }

    @Override
//    @Async("asyncTaskExecutor")
    public void synchronousUserOrg() {
        log.info("同步用户组织关系开始");
        // 1. 分页信息（保留，默认第一页500条）
        Integer pageNo = 1;
        Integer pageSize = 10000;
        List<SysUser> sysUsers = new ArrayList<>();
        // 查询标准数下所有部门id信息
        List<String> deptIds = userOrgMapper.getDeptId();
        while(true) {
            JSONObject jsonObject = buildJsonData(pageNo++,pageSize,orgCode,userOrgToken);
            log.info("获取用户组织关系请求报文:{}",jsonObject.toJSONString());
            String resBody = ApiUtils.getDate(userOrgUrl, jsonObject.toJSONString());
            if(null==resBody) {
                break;
            }
            JSONArray array = ApiUtils.parseResult(resBody);
            if(CollectionUtils.isEmpty(array)) {
                break;
            }
            array.stream().forEach(i-> {
                JSONObject u = JSONObject.parseObject(i.toString());
                String userId= u.getString("SU_ID");
                String userDeptId=  u.getString("SD_ID");
                if("8304".equals(userId)){
                    log.info("用户id:{},部门id:{}",userId,userDeptId);
                }
            });

            List<Object> collect = array.stream().filter(i -> deptIds.contains("mh:"+JSONObject.parseObject(i.toString()).getString("SD_ID"))).collect(Collectors.toList());
            sysUsers.addAll(buildSysUesrOrg(collect));
        }
        if(!CollectionUtils.isEmpty(sysUsers)) {
            Map<String, List<SysUser>> group = sysUsers.stream().collect(Collectors.groupingBy(SysUser::getDeptid));
            group.forEach((k,v)->{
                if(!CollectionUtils.isEmpty(v)) {
                    userOrgMapper.updateUserOrg(k, v);
                }
            });
        }
        //更新人员部门信息
        userOrgMapper.updateUserOrgName();
        userOrgMapper.updateTUserOrgName();
        log.info("同步用户组织关系开始");
    }

    private List<SysUser> buildSysUesrOrg(List<Object>  array) {
        List<SysUser> sysUsers = new ArrayList<>();
        if(CollectionUtils.isEmpty(array)) {
            return sysUsers;
        }
        array.forEach(i-> {
            JSONObject d = JSONObject.parseObject(i.toString());
            SysUser user = new SysUser();

//            RANK_MEMO	VARCHAR2	50	职务
//            CREATE_TIME	DATE		创建时间
//            UPDATE_TIME	DATE		修改时间
//            ID	NUMBER		序号，取S_ SYS_USER_DEPT_RELA序号
//            SU_ID	NUMBER		主账号ID
            user.setId("mh:"+d.getString("SU_ID"));
//            SD_ID	NUMBER		机构ID
            user.setDeptid("mh:"+d.getString("SD_ID"));
//            USER_ORDER	NUMBER		用户在组织机构中排序号
//            IS_PRIMARY	NUMBER		是否为主组织机构 0：非 1：是
//            CREATE_ID	NUMBER		创建人ID
//            UPDATE_ID	NUMBER		修改人ID
//            STATUS	NUMBER		状态 0：生效  1：失效
            sysUsers.add(user);
        });
        return sysUsers;
    }


    private JSONObject buildJsonData(Integer pageNo,Integer pageSize,String orgCode,String token) {
        JSONObject page = new JSONObject();
        page.put("currentPage", pageNo++);
        page.put("pageSize", pageSize);
        // 2. 权限信息（必须保留，否则无权限访问）
        JSONObject userInfo = new JSONObject();
        userInfo.put("departmentCode", orgCode);
        userInfo.put("tokenCode", token);
        // 3. 空查询参数（不传递任何可选条件，默认查询全部）
        JSONObject params = new JSONObject(); // 空对象，无任何查询条件
        // 4. 整合完整参数
        JSONObject jsonData = new JSONObject();
        jsonData.put("page", page);        // 分页信息
        jsonData.put("userInfo", userInfo);// 权限信息
        jsonData.put("params", params);    // 空查询条件
        System.out.println(jsonData.toJSONString());
        return jsonData;
    }
}
